package FooBarBibliotheque;

import java.io.Serializable;
import java.util.GregorianCalendar;

/* @authors vasquezs, haffafa, baldinof */
public class Emprunt implements Serializable {

    private static final long serialVersionUID = 1L;
    private GregorianCalendar dateEmprunt;
    private Lecteur lecteur;
    private Exemplaire exemplaire;

    public Emprunt(GregorianCalendar d) {
        //consructeur de la classe Emprunt
        this(); //appel au constructeur par defaut de Emprunt
        setDateEmprunt(d);
    }

    public Emprunt() {
        //constructeur par defaut de Emprunt
        setExemplaire(null);
        setLecteur(null);
    }

    public GregorianCalendar getDateEmprunt() {
        return dateEmprunt;
    }

    public void setDateEmprunt(GregorianCalendar dateEmprunt) {
        this.dateEmprunt = dateEmprunt;
    }

    public GregorianCalendar getDateRetour() {
        //dateRetour calculé a partir de la dateEmprunt
        GregorianCalendar d = (GregorianCalendar) dateEmprunt.clone(); //duplication de la dateEmprunt pour calculer la dateRetour
        d.setTimeInMillis(dateEmprunt.getTimeInMillis() + (long) (15 * 24 * 3600 * 1000));
        return d;
    }

    public Exemplaire getExemplaire() {
        return exemplaire;
    }

    public void setExemplaire(Exemplaire exemplaire) {
        this.exemplaire = exemplaire;
    }

    public Lecteur getLecteur() {
        return lecteur;
    }

    public void setLecteur(Lecteur lecteur) {
        this.lecteur = lecteur;
    }

    void lierEmpruntExemplaireLecteur(Exemplaire e, Lecteur l) {
        lierLecteur(l);
        lierExemplaire(e);
        e.lierEmprumtExemplaire(this);
    }

    private void lierLecteur(Lecteur l) {
        lecteur = l;
    }

    private void lierExemplaire(Exemplaire e) {
        exemplaire = e;
    }

    public void rendreExemplaire(Exemplaire e) {
        //rendreExemplaire consiste a rompre le lien entre le Lecteur et son Exemplaire
        Lecteur l = unLecteur();
        l.delierEmpruntLecteur(this);
        delierLecteur(l);
        delierExemplaire(e);
    }

    private Lecteur unLecteur() {
        return lecteur;
    }

    private void delierLecteur(Lecteur l) {
        lecteur = null;
    }

    private void delierExemplaire(Exemplaire e) {
        exemplaire = null;
    }

    @Override //redefinition de la methode toString de la classe Object pour afficher les infos de l'emprunt
    public String toString() {
        return "Date emprunt: " + EntreSortie.ecrireDate(dateEmprunt)
                + "\nDate retour prevu: " + EntreSortie.ecrireDate(getDateRetour()) + "\n";

    }

    public String infoExemplaire() {
        Exemplaire e = unExemplaire();
        return e.infoExemplaire();

    }

    private Exemplaire unExemplaire() {
        return exemplaire;
    }

    public boolean isEnRetard() {
        //verifie si la date courante est superieur a la dateRetour
        return getDateRetour().before(new GregorianCalendar());
    }


    public String infoOuvrageExemplaire() {
        return exemplaire.infoExemplaire();
    }

    public String infoLecteur() {
        //affiche les informations du Lecteur
        String str = "";
        GregorianCalendar d = (GregorianCalendar) dateEmprunt.clone();
        str += "Date emprunt: " + EntreSortie.ecrireDate(dateEmprunt)
                + "\nDate retour prevu: " + EntreSortie.ecrireDate(getDateRetour())
                + "\n" + lecteur.infoLecteurSimple();
        return str;
    }
}
